package com.pawernode.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.amqp.core.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;



/**
 * RabbitMQ配置类
 * 配置 RabbitMQ 中的交换机、队列以及绑定关系
 */
@Configuration
@ConfigurationProperties(prefix = "my")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RabbitConfig {

    private String exchangeName;
    private String queueNormalName;
    private String queueDlxName;

    /**
     * 声明一个直连交换机
     * @return DirectExchange类型的交换机
     */
    @Bean
    public DirectExchange directExchange() {
        return ExchangeBuilder.directExchange(exchangeName).build();
    }

    /**
     * 声明一个普通队列，并设置其属性
     * 包括死信交换机和死信路由键
     * @return Queue类型的队列
     */
    @Bean
    public Queue queue() {
        return QueueBuilder
                .durable(queueNormalName)
                .deadLetterExchange(exchangeName) // 设置死信交换机 ,设置相同交换机
                .deadLetterRoutingKey("error") // 设置死信路由键，要和死信交换机中的路由键保持一致
                .build();
    }

    /**
     * 绑定普通队列到直连交换机
     * @param directExchange 直连交换机
     * @param queue 普通队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding bindingNormal(DirectExchange directExchange, Queue queue) {
        return BindingBuilder.bind(queue).to(directExchange).with("order");
    }

    /**
     * 声明一个死信队列
     * @return Queue类型的死信队列
     */
    @Bean
    public Queue dlxQueue() {
        return QueueBuilder.durable(queueDlxName).build();
    }

    /**
     * 绑定死信队列到直连交换机
     * @param directExchange 直连交换机
     * @param dlxQueue 死信队列
     * @return Binding类型的绑定关系
     */
    @Bean
    public Binding bindingDlx(DirectExchange directExchange, Queue dlxQueue) {
        return BindingBuilder.bind(dlxQueue).to(directExchange).with("error");
    }
}
